package xml;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import remoto.Proxy;
import util.gestorFecha;
import dominioTO.ClienteTO;
import dominioTO.ItemCotizacionTO;
import dominioTO.OrdenPedidoClienteTO;
import dominioTO.RodamientoTO;


public class ODV_OrdenDePedidoClienteXML {
	private String ARCHIVO;
	private static ODV_OrdenDePedidoClienteXML instancia;
	private Document doc;
	
	public static ODV_OrdenDePedidoClienteXML getInstancia(String nombreArchivo){
		if(instancia == null){
			instancia = new ODV_OrdenDePedidoClienteXML();
			
		}
		instancia.ARCHIVO= "http://localhost:8080/ServidorNegocio/xml/"+nombreArchivo;
		instancia.crearDocumento();
		return instancia;
	}
	
	private void crearDocumento(){
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder;
		try {
			builder = factory.newDocumentBuilder();
			doc = builder.parse(ARCHIVO);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
		
	public OrdenPedidoClienteTO recibirOrdenPedidoClienteXML() throws RemoteException{
		
		OrdenPedidoClienteTO OPClienteTO= new OrdenPedidoClienteTO();
		
		NodeList listaNodos = doc.getElementsByTagName("OrdenDePedido");
		Node nodo_OP = listaNodos.item(0);
		Element element_OP = (Element) nodo_OP;
		
		//Obtengo el atributo del Numero de pedido de cliente
		OPClienteTO.setOrdenPedidoDelCliente(element_OP.getAttribute("numero"));
		
		//Fecha de emision de Cotizacion
		OPClienteTO.setFecha(gestorFecha.getFechaHoy());
				
		
		//Busco al cliente
		Element elementCliente = (Element)element_OP.getElementsByTagName("Cliente").item(0);
		OPClienteTO.setCliente(this.mapCliente(elementCliente));
		
		
		NodeList nodeListCotizacion  = element_OP.getElementsByTagName("Cotizacion");
		if (nodeListCotizacion != null){
			for (int j = 0; j < nodeListCotizacion.getLength(); j ++)
			{
				//Extraigo el nodo de la lista de nodos
				Node node_Cotizacion = (Element) nodeListCotizacion.item(j);
				Element element_Cotizacion = (Element) node_Cotizacion; 
				
				Integer idCotizacion = Integer.parseInt(element_Cotizacion.getElementsByTagName("Numero").item(0).getTextContent());
						
				
				//Busco nodo rodamiento --> Contiene Items
				NodeList nodeListRodamiento  = element_Cotizacion.getElementsByTagName("Item");
				
				List<ItemCotizacionTO> itemSolicitud= new ArrayList<ItemCotizacionTO>();
				
				if (nodeListRodamiento != null){
					for (int k = 0; k < nodeListRodamiento.getLength(); k ++) 
					{
						Node nodeRodamientos = nodeListRodamiento.item(j);
						if (nodeRodamientos.getNodeType() == Node.ELEMENT_NODE) {
							Element elementRodamiento = (Element) nodeRodamientos;					
							ItemCotizacionTO aux = mapItemCotizacionRodamiento(elementRodamiento, idCotizacion);
							if(aux!=null)
							{
								itemSolicitud.add(aux);	
							}						
						}
					}
				}
				OPClienteTO.setCotizaciones(itemSolicitud);
			}
		
		}
		return OPClienteTO;

	}
	
	
	private ClienteTO  mapCliente(Element elementCliente) {
		try {
			String cuil = elementCliente.getElementsByTagName("Cuil").item(0).getTextContent();
			ClienteTO cliTO = Proxy.getInstancia().buscarCliente(cuil);
			
			return cliTO;
			
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
		
	
	}

	private ItemCotizacionTO  mapItemCotizacionRodamiento(Element elementItem, Integer id) throws RemoteException {
		
		
		Integer cantidad = Integer.valueOf(elementItem.getElementsByTagName("Cantidad").item(0).getTextContent());
		//Busco si existe el rodamiento buscado
		String nSerie = elementItem.getAttribute("serie");
		String Marca = elementItem.getElementsByTagName("Marca").item(0).getTextContent();
		String Origen =elementItem.getElementsByTagName("Origen").item(0).getTextContent();
		String Sufijo = elementItem.getElementsByTagName("Sufijo").item(0).getTextContent();
		RodamientoTO rod = Proxy.getInstancia().buscarRodamiento(nSerie, Sufijo, Marca, Origen);
		
		//Busco en la cotizacion indicada por el cliente el Item que cumpla que la cantidad sea menor a la cotizada, y busco el precio
		ItemCotizacionTO itemCotizacion = Proxy.getInstancia().getItemCotizacionOPCliente(id, rod, cantidad);
		
		if(itemCotizacion!=null)
		{
			ItemCotizacionTO item = new ItemCotizacionTO();		
			item.setCantidad(cantidad);
			item.setPrecio(itemCotizacion.getPrecio());
			item.setRodamiento(rod);
			item.setItemListaPrecio(itemCotizacion.getItemListaPrecio());
			return item;
		}
		return null;
	}
	

}
